/**
 *@Name: CFa
 *@Description: Clase que manipula las facturas desde tablas fa100 y fa101
 *@Version: 1.01.7
 *@Author: Andrés Albán
 */
package facturacion;

import conexion.CConexion;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import utilitario.CFecha;
import validaciones.CLogin;

public class CFa100 extends CConexion {

    private String compania = null; //Compañía actual
    private String sucursal = null; // Sucursal actual
    private String tipoDocumento = null; // Tipo de documento FA,FE,FL
    private String numeroComprobante = null; // Número secuancial de comprobante de la tabla pt100
    private String numeroFactura = null; //Número de factura
    private String codigoCliente = null; // Codigo del cliente al qu se factura
    private String rucCliente = null; // RUC o CI del cliente al que se factura
    private String nombreCliente = null; // nombre del cliente al que se factura
    private String direccionCliente = null; // direccion del cliente al que se factura
    private String telefonoCliente = null; // telefono del cliente al que se factura
    private String fechaFactura = null; //Fecha de facturación
    private String loginVendedor = null; // Vendedor (Usuario actual)
    private String tipoFactura = null; // Tipo de factura (Efectivo (H) o crédito (C))
    private String subtotal = null; // Subtotal de la factura (Suma de los items del detalle)
    private String descuento = null; // Valor del descuento (subtotal de la factura x porcentaje de descuento)
    private String porcentajeDescuento = null; // porcentaje del descuento del cliente
    private String saldoIva = null; // valor total del iva cuando aplica
    private String saldoNoIva = null; // valor total del iva cuando no aplica
    private String totalIva = null; // total del iva a aplicar a la factura
    private String porcentajeIva = null; // porcentaje del iva
    private String cargos = null; // Valor total de cargos extra 
    private String totalFactura = null; // total de la factura (Subtotal + iva)
    private String totalEfectivo = null; // total cancelado en efectivo
    private String totalCredito = null; // total credito al cliente
    private String anticipo = null; // anticipo en caso de que el cliente abone
    private String estado = null; // estad de la factura (pendiente (P) o contabilizada (C))
    private String anulado = null; // factura anulada o no (S/N)
    private String fechaAnulacion = null; //fecha en que se anula la factura en caso de asi serlo
    private String usuarioActual = null; //usuario actual
    private String fechaActual = null; //fecha actual
    private CFecha fechaSistema = null;//Clase que manupula la fecha actual
    private String[][] detalleFa101 = null;
    private int filasDetalle = 0;
    private int columnasDetalle = 0;

    public CFa100() {
        try {
            login = new CLogin(); //Instanciación de la case Txt
            fechaSistema = new CFecha(); // Instanciación de la clase CFecha
            this.compania = login.getCompaniaActual(); //inicialización de compania actual
            this.sucursal = login.getSucursalActual(); //inicialización de usuario actual
            this.loginVendedor = login.getUsuarioLogin(); //inicialización de vendedor
            this.estado = "C";  //inicialización de estado de factura
            this.anulado = "N"; // //inicialización de variable de anulación
            this.fechaAnulacion = "1900-01-01";  //inicialización de fecha de anulación
            this.usuarioActual = login.getUsuarioLogin(); //inicialización del usuario actual
            this.fechaActual = fechaSistema.getFechaCompleta(); //inicialización de fecha actual con la fecha del sistema
            this.subtotal = "0.00"; // inicialización de variable de subtotal de la factura
            this.descuento = "0.00"; // iniciaización de variable de Valor del descuento
            this.porcentajeDescuento = "0.00"; // inicialización de variable de porcentaje del descuento del cliente
            this.saldoIva = "0.00"; // inicialización de variable de  valor total del iva cuando aplica
            this.saldoNoIva = "0.00"; // inicialización de variable de valor total del iva cuando no aplica
            this.totalIva = "0.00"; // inicialización de variable de total del iva a aplicar a la factura
            this.porcentajeIva = "0.00"; // inicialización de variable de  porcentaje del iva
            this.cargos = "0.00"; // inicialización de variable de Valor total de cargos extra 
            this.totalFactura = "0.00"; //inicialización de variable de total de la factura (Subtotal + iva)
            this.totalEfectivo = "0.00"; //inicialización de variable de total cancelado en efectivo
            this.totalCredito = "0.00"; //inicialización de variable de total credito al cliente
            this.columnasDetalle = 18;//numero de columnas de detalle
            String sqlIva = "select pt100valo from pt100 where pt100tire='IM' and pt100copr='SRI' and pt100cose='IVA' and pt100nocia='" + this.compania + "'";
            Statement stncIva = this.getConexion().createStatement();
            ResultSet rsIva = stncIva.executeQuery(sqlIva);
            rsIva.next();
            this.porcentajeIva = rsIva.getString("pt100valo");
        } catch (SQLException ex) {
            Logger.getLogger(CFa100.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void crearCabeceraFa100(String tido, String noco, String nofa, String cocl, String iruc, String nocl, String dicl, String tecl, String fefa, String tifa, String toef, String desc, String anti) throws SQLException {
        this.tipoDocumento = tido;
        this.numeroComprobante = noco;
        this.numeroFactura = nofa;
        this.codigoCliente = cocl;
        rucCliente = iruc;
        this.nombreCliente = nocl;
        this.direccionCliente = dicl;
        this.telefonoCliente = tecl;
        this.fechaFactura = fefa;
        this.tipoFactura = tifa;
        /////////////////////////////////////////////////
        double dSubt = 0.00;
        for (int i = 0; i < filasDetalle; i++) {
            dSubt += Double.parseDouble(getDetalleFa101()[i][12]);
        }
        //////////////////////////////////////////////////
        this.subtotal = String.valueOf(dSubt);
        this.descuento = desc;
        this.porcentajeDescuento = String.valueOf((Double.parseDouble(this.getDescuento()) * 100) / Double.parseDouble(this.getSubtotal()));
        //////////////////////////////////////////////////
        Double iva = 0.00;
        Double noIva = 0.00;
        for (int i = 0; i < filasDetalle; i++) {
            double num1 = Double.parseDouble(getDetalleFa101()[i][9]);
            double cant = Double.parseDouble(getDetalleFa101()[i][10]);
            double tot = cant * num1;
            if (getDetalleFa101()[i][17].equals("S")) {
                iva += tot;
            } else {
                noIva += tot;
            }
        }
        //////////////////////////////////////////////////
        this.saldoIva = String.valueOf(iva);
        this.saldoNoIva = String.valueOf(noIva);
        this.totalIva = String.valueOf(Double.parseDouble(this.getSaldoIva()) * (Double.parseDouble(this.porcentajeIva) / 100));
        this.totalFactura = String.valueOf(Double.parseDouble(this.getSaldoNoIva()) + Double.parseDouble(this.getSaldoIva()) + Double.parseDouble(this.getTotalIva()));
        this.totalEfectivo = toef;
        this.totalCredito = String.valueOf(Double.parseDouble(this.getTotalFactura()) - Double.parseDouble(this.getTotalEfectivo()));
        this.anticipo = anti;// inicialización de variable de antcipos a la factura
        Statement stncCrearFa100 = this.getConexion().createStatement();
        String sqlCrearFa100 = "insert into fa100 values('" + getCompania() + "','" + getSucursal() + "','" + getTipoDocumento() + "','" + getNumeroComprobante() + "','" + getNumeroFactura() + "','" + getCodigoCliente() + "','" + getRucCliente() + "','" + getNombreCliente() + "','" + getDireccionCliente() + "','" + getTelefonoCliente() + "','" + getFechaFactura() + "','" + getLoginVendedor() + "','" + getTipoFactura() + "'," + getSubtotal() + "," + getDescuento() + "," + getPorcentajeDescuento() + "," + getSaldoNoIva() + "," + getSaldoIva() + "," + getTotalIva() + "," + getPorcentajeIva() + "," + getCargos() + "," + getTotalFactura() + "," + getTotalEfectivo() + "," + getTotalCredito() + "," + getAnticipo() + ",'" + getEstado() + "','" + getAnulado() + "','" + getFechaAnulacion() + "','" + usuarioActual + "','" + fechaActual + "','" + usuarioActual + "','" + fechaActual + "')";
        stncCrearFa100.execute(sqlCrearFa100);
        stncCrearFa100.close();
        System.out.println(sqlCrearFa100);
        crearDetalle();
    }

    private void crearDetalle() throws SQLException {
        for (int i = 0; i < filasDetalle; i++) {
            Statement stncCrearFa101 = this.getConexion().createStatement();
            String sqlCrearFa101 = "insert into fa101 values('" + getDetalleFa101()[i][0] + "','" + getDetalleFa101()[i][1] + "','" + getTipoDocumento() + "'," + getNumeroComprobante() + "," + getDetalleFa101()[i][4] + "," + getDetalleFa101()[i][5] + ",'" + getDetalleFa101()[i][6] + "','" + getDetalleFa101()[i][7] + "','" + getDetalleFa101()[i][8] + "'," + getDetalleFa101()[i][9] + "," + getDetalleFa101()[i][10] + "," + getDetalleFa101()[i][11] + "," + getDetalleFa101()[i][12] + ",'" + getDetalleFa101()[i][13] + "','" + getDetalleFa101()[i][14] + "','" + getDetalleFa101()[i][15] + "','" + getDetalleFa101()[i][16] + "')";
            stncCrearFa101.execute(sqlCrearFa101);
            stncCrearFa101.close();
            System.out.println(sqlCrearFa101);
        }
    }

    public void setDetalleFa101(int filas, String[][] detalle) {
        this.filasDetalle = filas;
        this.detalleFa101 = new String[filasDetalle][columnasDetalle];
        for (int i = 0; i < filasDetalle; i++) {
            this.detalleFa101[i][0] = getCompania();
            this.detalleFa101[i][1] = getSucursal();
            this.detalleFa101[i][2] = getTipoDocumento();
            this.detalleFa101[i][3] = getNumeroComprobante();
            this.detalleFa101[i][4] = detalle[i][7];//Numero de orden
            this.detalleFa101[i][5] = detalle[i][8]; //Codigo de asociado
            this.detalleFa101[i][6] = detalle[i][9]; //Apellido de asociado
            this.detalleFa101[i][7] = detalle[i][10]; //Nombre de asociado
            this.detalleFa101[i][8] = detalle[i][1]; //Descripcion-Examen
            this.detalleFa101[i][9] = detalle[i][2]; //Precio unitario
            this.detalleFa101[i][10] = detalle[i][0]; //Cantidad
            this.detalleFa101[i][11] = "0.00"; //Descuento
            this.detalleFa101[i][12] = String.valueOf(Double.parseDouble(detalle[i][0]) * (Double.parseDouble(detalle[i][2]) - Double.parseDouble(getDetalleFa101()[i][11])));//Total por detalle
            this.detalleFa101[i][13] = usuarioActual;
            this.detalleFa101[i][14] = fechaActual;
            this.detalleFa101[i][15] = usuarioActual;
            this.detalleFa101[i][16] = fechaActual;
            this.detalleFa101[i][17] = detalle[i][4];
        }
    }

    public void anularFactura(String nofa) throws SQLException {
        String sqlFa100Noco = "select fa100noco,fa100tocr from fa100 where fa100nofa='" + nofa + "'";
        Statement stncFa100Noco = this.getConexion().createStatement();
        ResultSet rsFa100Noco = stncFa100Noco.executeQuery(sqlFa100Noco);
        rsFa100Noco.next();
        String noco = rsFa100Noco.getString("fa100noco");
        String credito = rsFa100Noco.getString("fa100tocr");
        rsFa100Noco.close();
        stncFa100Noco.close();
        String sqlNoas = "select co100noas from co100 where co100noco='" + nofa + "'";
        Statement stncNoas = this.getConexion().createStatement();
        ResultSet rsNoas = stncNoas.executeQuery(sqlNoas);
        rsNoas.next();
        String noas = rsNoas.getString("co100noas");
        rsNoas.close();
        stncNoas.close();
        String sqlDeleteCo101 = "delete from co101 where co101noas='" + noas + "'";
        Statement stncDeleteCo101 = this.getConexion().createStatement();
        stncDeleteCo101.execute(sqlDeleteCo101);
        stncDeleteCo101.close();
        String sqlDeleteCo100 = "delete from co100 where co100noas='" + noas + "'";
        Statement stncDeleteCo100 = this.getConexion().createStatement();
        stncDeleteCo100.execute(sqlDeleteCo100);
        stncDeleteCo100.close();
        if (Double.parseDouble(credito) > 0.00) {
            String sqlCxc100 = "select cxc100nodo from cxc100 where cxc100comp='" + nofa + "'";
            Statement stncCxc100 = this.getConexion().createStatement();
            ResultSet rsCxc100 = stncCxc100.executeQuery(sqlCxc100);
            rsCxc100.next();
            String nodoCxc = rsCxc100.getString("cxc100nodo");
            rsCxc100.close();
            stncCxc100.close();
            String sqlDeleteCxc101 = "delete from cxc101 where cxc101nodo='" + nodoCxc + "'";
            Statement stncDeleteCxc101 = this.getConexion().createStatement();
            stncDeleteCxc101.execute(sqlDeleteCxc101);
            stncDeleteCxc101.close();
            String sqlDeleteCxc100 = "delete from cxc100 where cxc100nodo='" + nodoCxc + "'";
            Statement stncDeleteCxc100 = this.getConexion().createStatement();
            stncDeleteCxc100.execute(sqlDeleteCxc100);
            stncDeleteCxc100.close();
        } else {
            String sqlDeleteCa100 = "delete from ca100 where ca100noas='" + noas + "'";
            Statement stncDeleteCa100 = this.getConexion().createStatement();
            stncDeleteCa100.execute(sqlDeleteCa100);
            stncDeleteCa100.close();
        }
        String sqlDeleteFa101 = "delete from fa101 where fa101noco='" + noco + "'";
        Statement stncDeleteFa101 = this.getConexion().createStatement();
        stncDeleteFa101.execute(sqlDeleteFa101);
        stncDeleteFa101.close();
        String sqlUpFa100 = "update fa100 set fa100subt=0.00,fa100sniv=0.00,fa100saiv=0.00,fa100tiva=0.00,fa100ivap=0.00,fa100carg=0.00,fa100tofa=0.00,fa100toef=0.00,fa100tocr=0.00,fa100anti=0.00,fa100anul='S',fa100lomo='" + usuarioActual + "',fa100femo='" + fechaActual + "' where fa100nofa='" + nofa + "'";
        Statement stncUpFa100 = this.getConexion().createStatement();
        stncUpFa100.executeUpdate(sqlUpFa100);
        stncUpFa100.close();
    }

    public boolean esAnulable(String nofa) throws SQLException {

        boolean resultado = true;
        String sqlFa100Noco = "select fa100tocr from fa100 where fa100nofa='" + nofa + "'";
        Statement stncFa100Noco = this.getConexion().createStatement();
        ResultSet rsFa100Noco = stncFa100Noco.executeQuery(sqlFa100Noco);
        rsFa100Noco.next();
        String credito = rsFa100Noco.getString("fa100tocr");
        rsFa100Noco.close();
        stncFa100Noco.close();
        if (Double.parseDouble(credito) > 0.00) {
            String sqlCxc100 = "select cxc100nodo from cxc100 where cxc100comp='" + nofa + "'";
            Statement stncCxc100 = this.getConexion().createStatement();
            ResultSet rsCxc100 = stncCxc100.executeQuery(sqlCxc100);
            rsCxc100.next();
            String nodoCxc = rsCxc100.getString("cxc100nodo");
            rsCxc100.close();
            stncCxc100.close();
            String sqlCountCxc101 = "select count(cxc101nose) from cxc101 where cxc101nodo='" + nodoCxc + "'";
            Statement stncCountCxc101 = this.getConexion().createStatement();
            ResultSet rsCountCxc101 = stncCountCxc101.executeQuery(sqlCountCxc101);
            rsCountCxc101.next();
            int detalleCxc101 = Integer.parseInt(rsCountCxc101.getString(1));
            rsCountCxc101.close();
            stncCountCxc101.close();
            if (detalleCxc101 <= 1) {
                resultado = true;
            } else {
                resultado = false;
            }
        }
        return resultado;
    }

    public ResultSet buscaFactura() throws SQLException {
        String sqlBuscarFactura = "select * from fa100 where fa100nocia='" + this.compania + "' and fa100alma='" + this.sucursal + "' and fa100tido='" + this.tipoDocumento + "' and fa100nofa='" + this.numeroFactura + "'";
        Statement stncBuscarFactura = this.getConexion().createStatement();
        System.out.println(sqlBuscarFactura);
        ResultSet rsBuscaFactura = stncBuscarFactura.executeQuery(sqlBuscarFactura);
        return rsBuscaFactura;
    }

    public ResultSet buscaFactura(String noco, String tido) throws SQLException {
        String sqlBuscarFactura = "select * from fa100 where fa100nocia='" + this.compania + "' and fa100alma='" + this.sucursal + "' and fa100tido='" + tido + "' and fa100noco='" + noco + "'";
        Statement stncBuscarFactura = this.getConexion().createStatement();
        System.out.println(sqlBuscarFactura);
        ResultSet rsBuscaFactura = stncBuscarFactura.executeQuery(sqlBuscarFactura);
        return rsBuscaFactura;
    }

    /**
     * @return the compania
     */
    public String getCompania() {
        return compania;
    }

    /**
     * @return the sucursal
     */
    public String getSucursal() {
        return sucursal;
    }

    /**
     * @return the tipoDocumento
     */
    public String getTipoDocumento() {
        return tipoDocumento;
    }

    /**
     * @return the numeroComprobante
     */
    public String getNumeroComprobante() {
        return numeroComprobante;
    }

    /**
     * @return the numeroFactura
     */
    public String getNumeroFactura() {
        return numeroFactura;
    }

    /**
     * @return the codigoCliente
     */
    public String getCodigoCliente() {
        return codigoCliente;
    }

    /**
     * @return the rucCliente
     */
    public String getRucCliente() {
        return rucCliente;
    }

    /**
     * @return the nombreCliente
     */
    public String getNombreCliente() {
        return nombreCliente;
    }

    /**
     * @return the direccionCliente
     */
    public String getDireccionCliente() {
        return direccionCliente;
    }

    /**
     * @return the telefonoCliente
     */
    public String getTelefonoCliente() {
        return telefonoCliente;
    }

    /**
     * @return the fechaFactura
     */
    public String getFechaFactura() {
        return fechaFactura;
    }

    /**
     * @return the loginVendedor
     */
    public String getLoginVendedor() {
        return loginVendedor;
    }

    /**
     * @return the tipoFactura
     */
    public String getTipoFactura() {
        return tipoFactura;
    }

    /**
     * @return the subtotal
     */
    public String getSubtotal() {
        return subtotal;
    }

    /**
     * @return the descuento
     */
    public String getDescuento() {
        return descuento;
    }

    /**
     * @return the porcentajeDescuento
     */
    public String getPorcentajeDescuento() {
        return porcentajeDescuento;
    }

    /**
     * @return the saldoIva
     */
    public String getSaldoIva() {
        return saldoIva;
    }

    /**
     * @return the saldoNoIva
     */
    public String getSaldoNoIva() {
        return saldoNoIva;
    }

    /**
     * @return the totalIva
     */
    public String getTotalIva() {
        return totalIva;
    }

    /**
     * @return the porcentajeIva
     */
    public String getPorcentajeIva() {
        return porcentajeIva;
    }

    /**
     * @return the cargos
     */
    public String getCargos() {
        return cargos;
    }

    /**
     * @return the totalFactura
     */
    public String getTotalFactura() {
        return totalFactura;
    }

    /**
     * @return the totalEfectivo
     */
    public String getTotalEfectivo() {
        return totalEfectivo;
    }

    /**
     * @return the totalCredito
     */
    public String getTotalCredito() {
        return totalCredito;
    }

    /**
     * @return the anticipo
     */
    public String getAnticipo() {
        return anticipo;
    }

    /**
     * @return the estado
     */
    public String getEstado() {
        return estado;
    }

    /**
     * @return the anulado
     */
    public String getAnulado() {
        return anulado;
    }

    /**
     * @return the fechaAnulacion
     */
    public String getFechaAnulacion() {
        return fechaAnulacion;
    }

    /**
     * @return the detalleFa101
     */
    public String[][] getDetalleFa101() {
        return detalleFa101;
    }

    public ResultSet buscarCabecera(String nombre, String nofa, String fecha, String ruc) throws SQLException {
        String sqlBuscaFa100 = "select fa100nocl,fa100iruc,fa100nofa,fa100tofa,fa100fefa,fa100dicl,fa100tecl,fa100sniv,fa100saiv,fa100tiva,fa100desc,fa100tofa,fa100noco,fa100subt from fa100 where fa100nocia='" + compania + "' and fa100alma='" + sucursal + "' and fa100anul='N'";
        if (!nombre.isEmpty()) {
            sqlBuscaFa100 = sqlBuscaFa100 + " and fa100nocl like '%" + nombre + "%'";
        }
        if (!nofa.isEmpty()) {
            sqlBuscaFa100 = sqlBuscaFa100 + " and fa100nofa like '%" + nofa + "%'";
        }
        if (!fecha.isEmpty()) {
            sqlBuscaFa100 = sqlBuscaFa100 + " and fa100fefa='" + fecha + "'";
        }
        if (!ruc.isEmpty()) {
            sqlBuscaFa100 = sqlBuscaFa100 + " and fa100iruc='" + ruc + "'";
        }
        Statement stncBuscaFa100 = this.getConexion().createStatement();
        ResultSet rsBuscaFa100 = stncBuscaFa100.executeQuery(sqlBuscaFa100);
        return rsBuscaFa100;
    }

    public ResultSet buscarDetalle(String noco) throws SQLException {
        String sql = "select fa101cant,fa101exam,fa101valo,fa101tota from fa101 where fa101nocia='" + compania + "' and fa101alma='" + sucursal + "' and fa101noco='" + noco + "'";
        Statement stnc = this.getConexion().createStatement();
        return stnc.executeQuery(sql);
    }

    public boolean existeFactura(String numeroFactura) throws SQLException {
        boolean resultado;
        String sql = "select fa100nofa from fa100 where fa100nocia='" + compania + "' and fa100alma='" + sucursal + "' and fa100nofa='" + numeroFactura + "'";
        Statement stnc = this.getConexion().createStatement();
        ResultSet rs = stnc.executeQuery(sql);
        if (rs.next()) {
            resultado = true;
        } else {
            resultado = false;
        }
        return resultado;
    }
}
